package socket;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
 * 聊天室客户端
 */
public class Client {
    /*
      java.net.Socket 套接字
      它封装了TCP协议的通讯细节，使用它要吧和服务端建立连接并进行交互
     */
    private Socket socket;
    public Client(){
        try {
            System.out.println("正在连接服务端...");
            /*
              实例化Socket对象，就是与远端计算机建立连接的过程
              这里需要传入两个参数:
              1.服务端的IP地址，用于找到网络上对方的计算机
              2.服务端口，用于找到服务端计算机上的服务端应用程序

              查看IP的操作:
               Windows系统:
                 1.win+r
                 2.输出cmd打开控制台
                 3.输入ipconfig命令查看ip地址
                 176.128.15.21
               mac:
                 1.在触控板上五指向中间聚拢
                 2.选择"终端"程序打开
                 3.输入/sbin/ifconfig查看IP地址
             */
            socket = new Socket("localhost",8088);  //进行三次握手
            System.out.println("服务端连接成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 该方法用于启动客户端程序的执行
     */
    public void start(){
        try {
            //启动一个线程来读取服务端发送过来的消息
            ServerHandler Handler = new ServerHandler();
            Thread t = new Thread(Handler);
            t.start();
            //向服务端发送消息
            /*
              Scoket提供了一个重要的方法:
              OutputStream getOutputStream()
              通过scoket获取输出流将写出的信息发送给服务端
             */
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter ow = new OutputStreamWriter(os, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(ow);
            PrintWriter pw = new PrintWriter(bw,true);  //自动行刷新
            Scanner sc = new Scanner(System.in);

            while(true){
                System.out.println("请输入昵称:");
                String nickName = sc.nextLine();
                if(nickName.trim().isEmpty()){
                    System.out.println("昵称不能为空");
                }else {
                    pw.println(nickName);
                    break;
                }
            }

            while(true){
                String msg = sc.nextLine();
                if ("exit".equalsIgnoreCase(msg)){
                    break;
                }
                pw.println(msg);    //发送数据到服务端
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                socket.close(); //进行了四次挥手
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        Client client = new Client();
        client.start();
    }

    private class ServerHandler implements Runnable{
        public void run() {
            try {
                //通过socket获取输入流用于读取服务端发送过来的消息
                InputStream is = socket.getInputStream();
                InputStreamReader ir = new InputStreamReader(is, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(ir);
                String msg;
                while ((msg = br.readLine()) != null){  //读取服务端发送过来的消息
                    System.out.println(msg);  //将服务端发送过来的消息输出
                }
            } catch (IOException e) {
                System.out.println("你有问题");
            }
        }
    }
}
